public class Test {
    public static void main(String[] args) {


    }

    /**
     *  移动零问题
     */
    public void moveZeroes(int[] nums) {
        if(nums == null || nums.length <=1) {
            return;
        }
        int dest = -1;
        for(int cur = 0;cur < nums.length;cur++) {
            if(nums[cur] != 0) {
                dest++;
                //交换
                int tmp = nums[cur];
                nums[cur] = nums[dest];
                nums[dest] = tmp;
            }
        }
    }
    /**
     * 复写零
     * 第一种写法
     */
    public void duplicateZeros(int[] arr) {
        //1.找最后一个复写指向的位置
        int cur = 0;
        int dest = -1;
        int n = arr.length;
        while(cur < n) {
            if(arr[cur] != 0) {
                dest++;
            }else {
                dest+=2;
            }
            if(dest >= n-1) {
                break;
            }
            cur++;
        }
        //2.处理dest越界情况
        if(dest == n) {
            dest--;
            arr[dest] = 0;
            dest--;
            cur--;

        }
        //3.复写操作
        while(cur >= 0) {
            if(arr[cur] == 0) {
                arr[dest--] = 0;
                arr[dest--] = 0;
                cur--;
            }else {
                arr[dest--] = arr[cur--];
            }
        }
    }
    /**
     * 第二种写法
     * 暴力解法
     */
    public void duplicateZeros2(int[] arr) {
        for(int cur=0;cur<arr.length-1;cur++) {
            if(arr[cur] == 0) {
                for(int dest = arr.length-2;dest>=cur+1;dest--) {
                    arr[dest+1] = arr[dest];
                }
                arr[++cur] = 0;
            }
        }
    }


}
